package Server;

import Strukture.Cvor;
import Strukture.ParLokMSek;
import Strukture.Stablo;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.io.WriteAbortedException;
import java.net.Socket;
import java.util.Date;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Klasa koja sadrzi metode koje se koriste za mrezni deo aplikacije.
 * @author ivail
 */
public class ServerNit extends Thread{
    
    byte [] bafer = new byte [1024];
    Socket soket;
    
    public ServerNit (Socket soket){
        this.soket = soket;
    }
    
    @Override
    public void run(){
        try {
            //inicijalizacija ulazno-izlaznih tokova
            //izlaz za tekst
            PrintWriter tokKaKlijentuTekst = new PrintWriter(soket.getOutputStream(), true);
           
            //izlaz za bajtove          
            OutputStream tokKaKlijentuBajtovi = soket.getOutputStream();
            
            //ulaz za linijski tekst         
            BufferedReader tokOdKlijentaTekst = new BufferedReader(new InputStreamReader(soket.getInputStream()));
            
            //ulaz za bajtove      
            InputStream tokOdKlijenta = soket.getInputStream();
            
            //za upisivanje podataka u fajl na disku
            FileOutputStream fos = null;
            BufferedOutputStream bos = null;
            
            
            /**
             * Zapocinjanje komunikacije sa klijentom (handshake)
             */
            
            
            String a = tokOdKlijentaTekst.readLine();
            System.out.println("Server je napisao:"+a);
            tokKaKlijentuTekst.println("Konekcija odobrena");
            System.out.println("Server je napisao:"+"Konekcija odobrena");
            
            
            String b = tokOdKlijentaTekst.readLine();
            System.out.println("Server je napisao:"+b);           

            
             /**
             * PROTOKOL 1 - KREIRANJE NOVOG KORISNIKA NA SERVERU
             */
                    
            if("Novi korisnik".equalsIgnoreCase(b)){
            
                //zahtevamo podatke o novom korisniku
                tokKaKlijentuTekst.println("Posalji mi podatke korisnika");
                //pravimo string sa primljenim podacima o korisniku  
                String ime = tokOdKlijentaTekst.readLine();
                String password = tokOdKlijentaTekst.readLine();
                
                //pravimo novog korisnika na serveru
                boolean statusPravljenja = false;
                try {
                    //metoda ispod vraca rezultat pravljenja korisnika i postavlja ga u promenljivu statusPravljenja
                    statusPravljenja = Engine.napraviNovogKorisnika(ime, password);
                } catch (Exception ex) {
                    Logger.getLogger(ServerNit.class.getName()).log(Level.SEVERE, null, ex);
                }
                
                System.out.println(statusPravljenja);
                if (statusPravljenja == true) {
                    tokKaKlijentuTekst.println("Uspesno napravljen novi korisnik");
                } else {
                    tokKaKlijentuTekst.println("Nesto se zeznulo");
                }
            }

             /**
             * PROTOKOL 2 - Autentifikacija i logovanje korisnika
             */
            
            if("Zelim da se ulogujem".equalsIgnoreCase(b)){
                
                //zahtevamo ime korisnika
                tokKaKlijentuTekst.println("Posalji ime korisnika");
                
                //pravimo string sa imenom korisnika
                String imeKorisnika = tokOdKlijentaTekst.readLine();
                
                //pravimo objekat korisnika koji cemo da koristimo za proveru
                Korisnik test = new Korisnik (imeKorisnika, null);
                
                boolean provera;
                provera = Engine.proveriDaLiVecPostoji(test);
                
                if(provera == false){
                 //ukoliko nalog ne postoji, vracamo klijentu odgovor da mora prvo napraviti nalog pa onda pokusati logovanje sa istim   
                    tokKaKlijentuTekst.println("Nalog ne postoji. Molimo vas napravite nalog.");
                    System.out.println("Ne postoji klijent");
                }else{
                    System.out.println("Klijent postoji");
                    
                    //trazimo sifru korisnika
                    tokKaKlijentuTekst.println("Posalji sifru korisnika");
                
                    //pravimo string sa sifrom korisnika
                    String sifraKorisnika = tokOdKlijentaTekst.readLine();
                   
                    //pravimo novi objekat za proveru
                    Korisnik zaProbu = new Korisnik (imeKorisnika, sifraKorisnika);
                    
                    boolean provera2;
                    provera2 = Engine.proveriPassword(zaProbu);
                    
                    if ( provera2 == true){
                        tokKaKlijentuTekst.println("Uspesno ste se ulogovali");
                    } else {
                        tokKaKlijentuTekst.println("Pogresno ime korisnika ili lozinka.");
                    }
                }
                
            }
            
            /**
             * PROTOKOL 3 - SINHRONIZACIJA 
             */
            

             //Ova lista sadrzi lokacije u okviru foldera klijenta (samo relativne putanje) koje on treba da prebaci na server
            LinkedList <String> listaZaTransportNaServer = new LinkedList <String> ();
            
            //slicno i za ovo
            LinkedList <String> listaZaTransportNaKlijenta = new LinkedList <String> ();
            
            /**
             * PROTOKOL 3 SLUCAJ 1 - SINHRONOIZACIJA KA SERVERU (KLIJENT IMA NOVIJE PODATKE)
             */
            
            if("Sinhronizacija ka Serveru".equalsIgnoreCase(b)){
                


            //Obradu gresaka nastalu parsiranjem preskacem
            
            //primamo ime i sifru korisnika od klijenta i postavljamo ih u stringove
            String imeKorisnika = tokOdKlijentaTekst.readLine();
            String sifraKorisnika = tokOdKlijentaTekst.readLine();    
                    
            //pravimo 2 objekta da bismo mogli da ih poredimo - jedan ce predstavljati korisnika na klijentu, drugi korisnika na serveru
            //pravimo 2 korisnika da bismo mogli da koristimo 2 seta listi koje su u instancama korisnika
            Korisnik korisnikKlijent = new Korisnik(imeKorisnika, sifraKorisnika);
            Korisnik korisnikServer = new Korisnik(imeKorisnika, sifraKorisnika);

            if (FileSystem.proveriDaLiSeSinhronizuje(korisnikKlijent)){
                tokKaKlijentuTekst.println("Ne moze!");
                System.out.println("Ne moze!");
                return;
            } else {
                tokKaKlijentuTekst.println("Moze!");
                ServerInfo.getAktivnoSinhronizuju().add(korisnikKlijent.getIme());
            }
                
                
            //proveravamo da li postoji korisnicki folder na serverskom disku, ako ne postoji pravimo ga
            File zaProveru = new File(ServerInfo.getLokacija()+korisnikServer.getIme());
            if (!zaProveru.exists()) FileSystem.napraviFolderKorisnika(korisnikServer);
            
            //zatim pravimo stablo za korisnika
            FileSystem.napraviStablo(FileSystem.napraviKoreniCvor(korisnikServer), korisnikServer);

            //posto klijent ima novije fajlove, trazimo ih od njega
            tokKaKlijentuTekst.println("Posalji mi spisak foldera i fajlova");
            
            //dobijamo info za pocetak slanja liste fajlova
            tokOdKlijentaTekst.readLine();
            
            //pravimo petlju u kojoj cemo da primamo stringove i dodajemo ih u listu
            while (true){
                String odgovor = tokOdKlijentaTekst.readLine();
                
                //ako klijent posalje da je kraj, iskace se iz petlje
                if (odgovor.equalsIgnoreCase("Kraj spiska fajlova")) break;
                korisnikKlijent.getListaLokacijaFajlovaRelativnePutanje().add(odgovor);
            }
            
            //dobijamo info za pocetak slanja liste foldera
            tokOdKlijentaTekst.readLine();
            
            //pravimo petlju u kojoj cemo da primamo stringove i dodajemo ih u listu            
            while (true){
                String odgovor = tokOdKlijentaTekst.readLine();
                
                //ako klijent posalje da je kraj, iskace se iz petlje
                if (odgovor.equalsIgnoreCase("Kraj spiska foldera")) break;
                korisnikKlijent.getListaLokacijaFolderaRelativnePutanje().add(odgovor);
            }               
                                                                
            //Deo metode koji proverava odnos spiska fajlova i foldera iz ova dva objekta korisnika
            //prvo da proverimo sta postoji, sta ne, sta je starije ako postoji...
                
                //prvo za foldere
                for (String klijentString: korisnikKlijent.getListaLokacijaFolderaRelativnePutanje()){
                    //pravimo string koji reprezentuje lokaciju na kojoj se nalazi taj folder ako postoji
                    String formatiranString = ServerInfo.getLokacija()+korisnikKlijent.getIme()+"/"+klijentString;
                    System.out.println(formatiranString);
                    
                    //proveravamo da li postoji i ako ne postoji pravimo ga
                    if (!korisnikServer.getListaLokacijaFoldera().contains(formatiranString)){
                        File napravi = new File (formatiranString);
                        napravi.mkdirs();
                        System.out.println("Napravljen folder:"+formatiranString);
                    }
                }
                

                LinkedList <String> bezMilisekundi = new LinkedList <String>();
                
                //secemo milisekunde iz svakog stringa lokacije iz liste                
                System.out.println("Bezmilisekundi pocetak server");
                for (String lok: korisnikServer.getListaLokacijaFajlova()){
                    ParLokMSek novie = FileSystem.vratiStringIzListeUNormalan(lok);
                    bezMilisekundi.add(novie.lokacija);
                    System.out.println(novie.lokacija);
                }
                System.out.println("bezmilisekundi server kraj");
                                  
                //ovde se proverava da li postoji fajl na serverskom disku i ukoliko postoji proverava se da li je stariji ili mladji (u odnosu na poslednju izmenu) od klijentskog    
                for (String klijentString: korisnikKlijent.getListaLokacijaFajlovaRelativnePutanje()){
                    ParLokMSek strukt = FileSystem.vratiStringIzListeUNormalan(klijentString);
                    String lokac = ServerInfo.getLokacija()+korisnikKlijent.getIme()+"/"+strukt.lokacija;
                    long milisekunde = strukt.milisekunde;
                    System.out.println("LOKAC je"+lokac);
                    
                    //proveravamo da li postoji fajl na serverskom disku, ako ne postoji dodajemo ga u listu za prebacivanje
                    if (!bezMilisekundi.contains(lokac)){
                        System.out.println("nema ga u bezmilisekundi!"+lokac);
                        listaZaTransportNaServer.add(klijentString);
                    }
                    
                    for (String lok: bezMilisekundi){

                        //ako postoji, proveravamo koji je stariji i ako je onaj na serveru stariji, klijent ce poslati novi
                        if (lok.equalsIgnoreCase(lokac)){
                            System.out.println("Klijent" + milisekunde);
                            File fajlServer = new File (lok);
                            System.out.println("server"+ fajlServer.lastModified());
                            System.out.println("Jednak je!"+lokac);

                            if (milisekunde>fajlServer.lastModified()){
                                listaZaTransportNaServer.add(klijentString);
                                System.out.println("Manji je!"+lokac);
                            }
                        }
                    }
                }

                //parsiramo stringove u listi
                LinkedList <String> listaZaTransportNaServerBezMilisekundi = new LinkedList <String> ();                
                
                for (String str: listaZaTransportNaServer){
                    listaZaTransportNaServerBezMilisekundi.add(FileSystem.vratiStringIzListeUNormalan(str).lokacija);
                }
                
                //test deo metode
//                System.out.println("Pocetak testa");
//                for (String str: listaZaTransportNaServerBezMilisekundi){
//                    System.out.println(str);
//                }
//                System.out.println("Kraj testa");
                
                
                //sada obavestavamo klijenta koje fajlove da posalje

                
                tokKaKlijentuTekst.println ("Sledi spisak fajlova koje treba prebaciti");
                for (String str: listaZaTransportNaServerBezMilisekundi){
                    tokKaKlijentuTekst.println(str);
                }
                tokKaKlijentuTekst.println("Kraj spiska");
                
                
                
                //test deo metode
                for (String stamp: listaZaTransportNaServerBezMilisekundi){
                    System.out.println(stamp);
                }
                
                //sada mrezni deo...

                //primamo fajlove od klijenta
                String mnogoOpakString = tokOdKlijentaTekst.readLine();

                System.out.println("ODAVDE POCINJE");
                for (int i=0; i<listaZaTransportNaServerBezMilisekundi.size(); i++){
                    System.out.println("Ima elemenata "+listaZaTransportNaServerBezMilisekundi.size());
                    System.out.println("UCITAO PRVI STRING IZ LISTE");
                    String tekst = tokOdKlijentaTekst.readLine();
                    System.out.println("Dobio od klijenta:"+tekst);
                    if (tekst.equalsIgnoreCase("Kraj fajlova")) break;
                    System.out.println("Nije break!");
                    //lokacija fajl
                    String lokacija = ServerInfo.getLokacija()+korisnikKlijent.getIme()+"/"+tekst;
                    System.out.println("Lokacija = "+lokacija);
                    
                    //pravimo novi objekat klase File
                    File file = new File(lokacija);
 
                    // ako fajl na diskku ne postoji, pravimo ga
                    if (!file.exists()) {
                        //file.getParentFile().mkdirs();
			file.createNewFile();
                        System.out.println("Ne postoji fajl na disku");
                    }
                    
                    tokKaKlijentuTekst.println("novi");
                    System.out.println("Poslao sam klijentu 'novi'");
                    RandomAccessFile raf = new RandomAccessFile (lokacija, "rw");
                    int n;
                    boolean kraj = false;
                    while (kraj == false){
                        
                        String check = tokOdKlijentaTekst.readLine();
                        if (check.equals("-1")){
                            kraj = true;
                            System.out.println("Postavio sam kraj na true!");
                        }
                        if (kraj==false){
                        //ucitavamo prenesene bajtove, pokusace da ucita 1024 bajta, n je broj bajtova koje je stvarno ucitao
                        n = tokOdKlijenta.read(bafer, 0, 1024);
                        System.out.println("n je"+n);

                        //bajtovi se upisuju u fajl
                        raf.write(bafer, 0, n);
                        System.out.println("Primio bafer");
                        tokKaKlijentuTekst.println();
                        }
                    }
                    System.out.println("Kraj fajla!");
                    raf.close();
                    tokKaKlijentuTekst.println("Moze naredni!");
                    //zatvara se tok ka fajlu

                    System.out.println("Poslao klijentu: Moze naredni");
                }
                System.out.println("GOTOVA METODA!");
                FileSystem.izbaciIzListeOnihKojiSeSinhronizuju(korisnikServer);
            }

            
            
            /**
             * PROTOKOL 4 - SINHRONIZACIJA OD SERVERA (server ima novije fajlove)
             */
            if ("Sinhronizacija od Servera".equalsIgnoreCase(b)){

             //Obradu gresaka nastalu parsiranjem preskacem
            
            //primamo ime i sifru korisnika od klijenta i postavljamo ih u stringove
            String imeKorisnika = tokOdKlijentaTekst.readLine();
            String sifraKorisnika = tokOdKlijentaTekst.readLine();
            
            //pravimo 2 objekta da bismo mogli da ih poredimo - jedan ce predstavljati korisnika na klijentu, drugi korisnika na serveru
            //pravimo 2 korisnika da bismo mogli da koristimo 2 seta listi koje su u instancama korisnika
            Korisnik korisnikKlijent = new Korisnik(imeKorisnika, sifraKorisnika);
            Korisnik korisnikServer = new Korisnik(imeKorisnika, sifraKorisnika);
 
            
            if (FileSystem.proveriDaLiSeSinhronizuje(korisnikKlijent)){
                tokKaKlijentuTekst.println("Ne moze!");
                System.out.println("Ne moze!");
                return;
            } else {
                tokKaKlijentuTekst.println("Moze!");
                ServerInfo.getAktivnoSinhronizuju().add(korisnikKlijent.getIme());
            }
                        
                        
            //proveravamo da li postoji korisnicki folder na serverskom disku, ako ne postoji pravimo ga
            File zaProveru = new File(ServerInfo.getLokacija()+korisnikServer.getIme());
            if (!zaProveru.exists()) FileSystem.napraviFolderKorisnika(korisnikServer);
            
            //zatim pravimo stablo za korisnika
            FileSystem.napraviStablo(FileSystem.napraviKoreniCvor(korisnikServer), korisnikServer);

            //posto klijent ima novije fajlove, trazimo ih od njega
            tokKaKlijentuTekst.println("Posalji mi spisak foldera i fajlova");
            
            //dobijamo info za pocetak slanja liste fajlova
            tokOdKlijentaTekst.readLine();
            
            //pravimo petlju u kojoj cemo da primamo stringove i dodajemo ih u listu
            while (true){
                String odgovor = tokOdKlijentaTekst.readLine();
                
                //ako klijent posalje da je kraj, iskace se iz petlje
                if (odgovor.equalsIgnoreCase("Kraj spiska fajlova")) break;
                korisnikKlijent.getListaLokacijaFajlovaRelativnePutanje().add(odgovor);
            }
            
            //dobijamo info za pocetak slanja liste foldera
            tokOdKlijentaTekst.readLine();
            
            //pravimo petlju u kojoj cemo da primamo stringove i dodajemo ih u listu            
            while (true){
                String odgovor = tokOdKlijentaTekst.readLine();
                
                //ako klijent posalje da je kraj, iskace se iz petlje
                if (odgovor.equalsIgnoreCase("Kraj spiska foldera")) break;
                korisnikKlijent.getListaLokacijaFolderaRelativnePutanje().add(odgovor);
            }               

            LinkedList <String> listaFolderaKojuTrebaDaNapraviKlijent = new LinkedList <String> ();

            //trebaju nam relativne putanje foldera na serveru
            for (String s: korisnikServer.getListaLokacijaFoldera()){
                korisnikServer.getListaLokacijaFolderaRelativnePutanje().add(FileSystem.vratiRelativnuPutanju(s, ServerInfo.getLokacija()+"/"+imeKorisnika));
            }
            
             //Deo metode koji proverava odnos spiska fajlova i foldera iz ova dva objekta korisnika
            //prvo da proverimo sta postoji, sta ne, sta je starije ako postoji...
                
                //prvo za foldere
                for (String serverString: korisnikServer.getListaLokacijaFolderaRelativnePutanje()){
                    System.out.println("serverString"+serverString);
                    //proveravamo da li postoji i ako ne postoji dodajemo ga u listu
                    if (!korisnikKlijent.getListaLokacijaFolderaRelativnePutanje().contains(serverString)){
                        listaFolderaKojuTrebaDaNapraviKlijent.add(serverString);
                    }
                }
                
                for (String s: korisnikKlijent.getListaLokacijaFajlovaRelativnePutanje()){
                    System.out.println("Klijent ima: "+s);
                }
                
                //saljemo listu foldera koje treba napraviti klijentu
                tokKaKlijentuTekst.println("Pocinje niz foldera");
                for (String str: listaFolderaKojuTrebaDaNapraviKlijent){
                    tokKaKlijentuTekst.println(str);
                }
                tokKaKlijentuTekst.println("Kraj liste foldera");

                LinkedList <String> bezMilisekundiServer = new LinkedList <String>();
                
                //secemo milisekunde iz svakog stringa lokacije iz liste                
                System.out.println("Bezmilisekundi pocetak server");
                for (String lok: korisnikServer.getListaLokacijaFajlova()){
                    ParLokMSek novie = FileSystem.vratiStringIzListeUNormalan(lok);
                    bezMilisekundiServer.add(novie.lokacija);
                    System.out.println(novie.lokacija);
                }
                System.out.println("bezmilisekundi server kraj");
                
                //dodajemo relativne putanje servera u listu
                System.out.println("Ser rel poc");
                for (String s: bezMilisekundiServer){
                    String k = FileSystem.vratiRelativnuPutanju(s, ServerInfo.getLokacija()+"/"+korisnikServer.getIme());
                    korisnikServer.getListaLokacijaFajlovaRelativnePutanje().add(k);
                    System.out.println(k);
                }
                System.out.println("Ser rel kra");

                LinkedList <String> bezMilisekundiKlijent = new LinkedList <String> ();
                //secemo milisekunde iz svakog stringa lokacije iz liste                
                System.out.println("Bezmilisekundi pocetak klijent");
                for (String lok: korisnikKlijent.getListaLokacijaFajlovaRelativnePutanje()){
                    ParLokMSek novie = FileSystem.vratiStringIzListeUNormalan(lok);
                    bezMilisekundiKlijent.add(novie.lokacija);
                    System.out.println(novie.lokacija);
                }
                System.out.println("bezmilisekundi klijent kraj");
                
                LinkedList <String> klijentCelePutanje = new LinkedList <String>();
                              
                //primamo listu fajlova
                tokOdKlijentaTekst.readLine();
                while(true) {
                    String od = tokOdKlijentaTekst.readLine();
                    if (od.equalsIgnoreCase("Kraj liste!")) break;
                    klijentCelePutanje.add (od);
                }

                LinkedList <String> listaZaPrenosFajlovaNaKlijenta = new LinkedList <String> ();
                
                //ovde se proverava da li postoji fajl na klijentskom disku i ukoliko postoji proverava se da li je stariji ili mladji (u odnosu na poslednju izmenu) od klijentskog    
                for (String serverString: korisnikServer.getListaLokacijaFajlova()){
                    ParLokMSek strukt = FileSystem.vratiStringIzListeUNormalan(serverString);
                    String lokac = FileSystem.vratiRelativnuPutanju(strukt.lokacija,ServerInfo.getLokacija()+"/"+korisnikServer.getIme());
                    System.out.println(lokac);
                    System.out.println("lokac = "+lokac);
                    long milisekunde = strukt.milisekunde;
                    System.out.println("milisekunde = "+milisekunde);

                    
                    //proveravamo da li postoji fajl na klijentskom disku, ako ne postoji dodajemo ga u listu za prebacivanje
                    if (!bezMilisekundiKlijent.contains(lokac)){
                        System.out.println("nema ga na klijentu!"+lokac);
                        listaZaPrenosFajlovaNaKlijenta.add(serverString);
                    } else {
                    
                    for (String lok: klijentCelePutanje){
                        
                        ParLokMSek struktura = FileSystem.vratiStringIzListeUNormalan(lok);
                        String lokacija = struktura.lokacija;
                        long milis = struktura.milisekunde;
                        System.out.println("milis = "+milis);

                        //ako postoji, proveravamo koji je stariji i ako je onaj na serveru mladji, saljemo ga klijentu
                        if (lokacija.equalsIgnoreCase(lokac)){
                            System.out.println("Klijent" + milisekunde);
                            File fajlServer = new File (lok);
                            System.out.println("server"+ fajlServer.lastModified());
                            System.out.println("Jednak je!"+lokac);

                            if (milisekunde<milis){
                                listaZaPrenosFajlovaNaKlijenta.add(serverString);
                                System.out.println("Salje se"+lokac);
                            }
                        }
                    }
                    }
                }

                //test deo metode
                System.out.println("ILIJA TEST");
                for (String s: listaZaPrenosFajlovaNaKlijenta){
                    System.out.println(s);
                }
                System.out.println("ILIJA KRAJ TESTA");
                
                LinkedList <String> fajloviZaSlanje = new LinkedList <String> ();
                //treba da prebacimo u relativne putanje i odsecemo milisekunde i posaljemo to klijentu zajedno sa bajtovima
                
                System.out.println("Konacni za slanje...");
                for (String s: listaZaPrenosFajlovaNaKlijenta){
                    String lokac = FileSystem.vratiStringIzListeUNormalan(s).lokacija;
                    String konacan = FileSystem.vratiRelativnuPutanju(lokac, ServerInfo.getLokacija()+"/"+korisnikKlijent.getIme());
                    fajloviZaSlanje.add(konacan);
                    System.out.println(konacan);
                }

                //treba da kazemo klijentu koliko fajlova mu saljemo
                tokKaKlijentuTekst.println(fajloviZaSlanje.size());
                
                
                   //saljemo klijentu podatke
                    tokKaKlijentuTekst.println("Saljem fajlove!");
                    for (String str: fajloviZaSlanje){
                        System.out.println("Ima elemenata "+fajloviZaSlanje.size());
                        
                        tokKaKlijentuTekst.println(str);
                        System.out.println("Poslao serveru" + " fajl");

                        tokOdKlijentaTekst.readLine();
                        System.out.println("Dobio poruku od servera");
                        RandomAccessFile raf = new RandomAccessFile (ServerInfo.getLokacija()+"/"+korisnikKlijent.getIme()+"/"+str, "r");
                        System.out.println("Napravio raf na lokaciji"+ ServerInfo.getLokacija()+"/"+korisnikKlijent.getIme()+str);
                        int n;
                        boolean kraj = false;
                        while (kraj == false){
                            //ucitava bajtove iz fajla, pokusace da ucita 1024 bajta, a kao n pamti koliko je stvarno ucitao
                            n = raf.read(bafer);
                            System.out.println("n je  "+n);
                            if (n == -1){
                                tokKaKlijentuTekst.println("-1");
                                kraj = true;
                                System.out.println("Kraj fajla! "+ServerInfo.getLokacija()+"/"+korisnikKlijent.getIme()+str);
                            }
                            if (kraj == false){
                            //ispisujemo tih n bajtova u izlazni tok ka serveru
                            tokKaKlijentuTekst.println("Veci od 0");
                            tokKaKlijentuBajtovi.write(bafer, 0, n);
                            System.out.println("Poslao bafer");
                            tokOdKlijentaTekst.readLine();
                            }
                        }
                        tokOdKlijentaTekst.readLine();
                        System.out.println("Poslao klijent "+ServerInfo.getLokacija()+"/"+korisnikKlijent.getIme()+str);
                        
                        //zatvaramo ulazni tok fajla
                        raf.close();
                    }
                    tokKaKlijentuTekst.println("Kraj fajlova");
                System.out.println("GOTOVA METODA!");               
                FileSystem.izbaciIzListeOnihKojiSeSinhronizuju(korisnikServer);                
                
                
                
                
                
                
                
                
                
                
                
//                
//                
//                
//                
//                
//                
////                
////                
////                
////                
////                //parsiramo stringove u listi
////                LinkedList <String> listaZaTransportNaServerBezMilisekundi = new LinkedList <String> ();                
////                
////                for (String str: listaZaTransportNaServer){
////                    listaZaTransportNaServerBezMilisekundi.add(FileSystem.vratiStringIzListeUNormalan(str).lokacija);
////                }
////                
////                //test deo metode
//////                System.out.println("Pocetak testa");
//////                for (String str: listaZaTransportNaServerBezMilisekundi){
//////                    System.out.println(str);
//////                }
//////                System.out.println("Kraj testa");
////                
////                
////                //sada obavestavamo klijenta koje fajlove da posalje
////
////                
////                tokKaKlijentuTekst.println ("Sledi spisak fajlova koje treba prebaciti");
////                for (String str: listaZaTransportNaServerBezMilisekundi){
////                    tokKaKlijentuTekst.println(str);
////                }
////                tokKaKlijentuTekst.println("Kraj spiska");
////                
////                
////                
////                //test deo metode
////                for (String stamp: listaZaTransportNaServerBezMilisekundi){
////                    System.out.println(stamp);
////                }
////                
////                //sada mrezni deo...
//
//                //primamo fajlove od klijenta
//                String mnogoOpakString = tokOdKlijentaTekst.readLine();
//
//                System.out.println("ODAVDE POCINJE");
//                for (int i=0; i<listaZaTransportNaServerBezMilisekundi.size(); i++){
//                    System.out.println("Ima elemenata "+listaZaTransportNaServerBezMilisekundi.size());
//                    System.out.println("UCITAO PRVI STRING IZ LISTE");
//                    String tekst = tokOdKlijentaTekst.readLine();
//                    System.out.println("Dobio od klijenta:"+tekst);
//                    if (tekst.equalsIgnoreCase("Kraj fajlova")) break;
//                    System.out.println("Nije break!");
//                    //lokacija fajl
//                    String lokacija = ServerInfo.getLokacija()+korisnikKlijent.getIme()+"/"+tekst;
//                    System.out.println("Lokacija = "+lokacija);
//                    
//                    //pravimo novi objekat klase File
//                    File file = new File(lokacija);
// 
//                    // ako fajl na diskku ne postoji, pravimo ga
//                    if (!file.exists()) {
//                        //file.getParentFile().mkdirs();
//			file.createNewFile();
//                        System.out.println("Ne postoji fajl na disku");
//                    }
//                    
//                    tokKaKlijentuTekst.println("novi");
//                    System.out.println("Poslao sam klijentu 'novi'");
//                    RandomAccessFile raf = new RandomAccessFile (lokacija, "rw");
//                    int n;
//                    boolean kraj = false;
//                    while (kraj == false){
//                        
//                        String check = tokOdKlijentaTekst.readLine();
//                        if (check.equals("-1")){
//                            kraj = true;
//                            System.out.println("Postavio sam kraj na true!");
//                        }
//                        if (kraj==false){
//                        //ucitavamo prenesene bajtove, pokusace da ucita 1024 bajta, n je broj bajtova koje je stvarno ucitao
//                        n = tokOdKlijenta.read(bafer, 0, 1024);
//                        System.out.println("n je"+n);
//
//                        //bajtovi se upisuju u fajl
//                        raf.write(bafer, 0, n);
//                        System.out.println("Primio bafer");
//                        tokKaKlijentuTekst.println();
//                        }
//                    }
//                    System.out.println("Kraj fajla!");
//                    raf.close();
//                    tokKaKlijentuTekst.println("Moze naredni!");
//                    //zatvara se tok ka fajlu
//
//                    System.out.println("Poslao klijentu: Moze naredni");
//                }
//                System.out.println("GOTOVA METODA!");            
//            
//            
//            
//            
//            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            }
                   soket.close();         
        } catch (IOException ex) {
            Logger.getLogger(ServerNit.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}
